// #define _XOPEN_SOURCE  1
// #define _SVID_SOURCE  1
// #define _POSIX_SOURCE  1
// #define _BSD_SOURCE  1
#include <header.h>
#include "encode.h"
#include "decode.h"




char *token_encode(){
    char *token = (char*)calloc(512, sizeof(char));

    // JWT字符串的长度
    size_t jwt_length;  

    // 初始化编码参数结构体
    struct l8w8jwt_encoding_params params;
    l8w8jwt_encoding_params_init(&params); 

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;  

    // 设置JWT的主要荷载部分内容:
    // 主题
    params.sub = "netdisk token";  
    // 签发者
    params.iss = "netdisk server";  
    // 接收方
    params.aud = "netdisk client";  

    // token签发时间
    params.iat = time(NULL);

    // token过期/有效时间 10min
    params.exp = params.iat + 1;  

    int uid = 8;
    char str[12];
    snprintf(str, sizeof(str), "%d", uid);
    struct l8w8jwt_claim claims[] = {
        { .key = "uid", .key_length = strlen("uid"), .value = str, .value_length = strlen(str) }
    };

    params.additional_payload_claims = claims;
    params.additional_payload_claims_count = sizeof(claims) / sizeof(claims[0]);

    
	// 设置加密密钥
    params.secret_key = (unsigned char*)"chizuru string token key";
    params.secret_key_length = strlen((char *)params.secret_key);

    // 输出变量
    params.out = &token;
    params.out_length = &jwt_length;

    // 加密
    l8w8jwt_encode(&params);

    return token;

}


void token_decode(char *token){
    // 初始化解码参数结构体
    struct l8w8jwt_decoding_params params;
    l8w8jwt_decoding_params_init(&params);  

    // 设置JWT使用的算法，这里使用HS512
    params.alg = L8W8JWT_ALG_HS512;  

    // token值

    // 填入token字符串和长度
    params.jwt = (char*)token;
    params.jwt_length = strlen(token);

    // 设置密钥
    char *public_key ="chizuru string token key";
    params.verification_key = (unsigned char*)public_key;
    params.verification_key_length = strlen(public_key);

    // 定义: 接收结果的指针和变量
    struct l8w8jwt_claim *claims = NULL;
    size_t claim_count = 0;
    enum l8w8jwt_validation_result validation_result;

    // 解码: 获得token中存储的信息
    int decode_result = l8w8jwt_decode(&params, &validation_result, &claims, &claim_count);

    // 判断是否是正确的token
    if (decode_result == L8W8JWT_SUCCESS && validation_result == L8W8JWT_VALID) {
        printf("Token validation successful!\n");

        // 打印token中解码出来的荷载信息
        for (size_t i = 0; i < claim_count; i++) {
            printf("Claim [%zu]: %s = %s\n", i, claims[i].key, claims[i].value);
        }
        // if(time(NULL) > atoi(claims[3].value)){
        //     printf("token过期\n");
        // }else{
        //     printf("token未过期\n");
        // }
        printf("uid = %d\n", atoi(claims[7].value));
        

    } else {
        printf("Token validation failed!\n");
    }

    l8w8jwt_free_claims(claims, claim_count);
}



int main() {
    char *token = NULL;
    token = token_encode(token);
    // printf("token:%s\n", token);
    sleep(4);
	token_decode(token);

    return 0;
}


